//
//  ZKHomeViewModel.swift
//  Weibo
//
//  Created by 郑克哥哥 on 2017/7/28.
//  Copyright © 2017年 郑克哥哥. All rights reserved.
//

import UIKit
import SDWebImage

//首页微博数据的网络请求
class ZKHomeViewModel: NSObject {
    
    //tableView数据源
    lazy var statusList: [ZKStatusViewModel] = [ZKStatusViewModel]()
    
    //加载微博数据
    func loadData(isUp:Bool, callBack: @escaping (Bool,String)->()){
        
        let token = ZKUserAccount.sharedViewModel.accessToken!
        
        //获取上拉微博id,加载历史微博数据
        var maxId: Int64 = 0
        //获取下拉微博id,加载最新微博数据
        var sinceId: Int64 = 0
        
        if isUp {
            
            //表示上拉加载
            maxId = statusList.last?.status?.id ?? 0
            if maxId > 0 {
                //防止数据重复,不获取当前传入微博id的这条数据
                maxId -= 1
            }
        }else{
            
            //下拉刷新
            sinceId = statusList.first?.status?.id ?? 0
            
        }
        
        var message = "没有加载到最新数据"
        NetworkTools.sharedTools.requestStatuses(access_token: token, maxID: maxId,sinceId:sinceId) { (response, error) in
            if error != nil{
                
                print("error:\(error!)")
                callBack(false, message)
                return
            }
            
            //网络请求成功
            let dic = response as! [String:Any]
            
            //获取微博字典数组
            let dicArr = dic["statuses"] as! [[String:Any]]
            
            //字典转模型
            let statusModelArr = NSArray.yy_modelArray(with: StatusModel.self, json: dicArr) as! [StatusModel]
            
            var tempArr = [ZKStatusViewModel]()
            
            //创建调度组
            let group = DispatchGroup()
            
            //遍历模型数组转成对应的viewModel的数组
            for statusModel in statusModelArr {
                
                //判断微博数据是否有单张图片
                if statusModel.pic_urls?.count == 1{
                    
                    let urlStr = statusModel.pic_urls?.first?.thumbnail_pic
                    
                    //如果原创只有一张图片,需要下载图片
                    //加入调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string:urlStr!), options: [], progress: nil, completed: { (image, imageData, error, _, _, _) in
                        
                        print("原创微博单图下载完成: url \(urlStr!)")
                        //图片下载完成从调度组离开
                        group.leave()
                    })
                }
                if statusModel.retweeted_status?.pic_urls?.count == 1{
                    
                    let urlStr = statusModel.retweeted_status?.pic_urls?.first?.thumbnail_pic
                    //如果转发微博只有一张图片
                    //加入调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string:urlStr!), options: [], progress: nil, completed: { (image, imageData, error, _, _, _) in
                        
                        print("转发微博单图下载完成: url \(urlStr!)")
                        //图片下载完成从调度组离开
                        group.leave()
                    })
                    
                }
                
                let viewModel = ZKStatusViewModel()
                
                //关联viewModel使用的模型
                viewModel.status = statusModel
                
                tempArr.append(viewModel)
                
            }
            
//            //赋值
//            self.statusList = tempArr
            
            if isUp{
                //表示上拉刷新,把请求回来的数据添加到原始数组的最后面
                self.statusList.append(contentsOf: tempArr)
            }else{
                
                //下拉刷新,把请求回来的数据添加到最前面
                self.statusList.insert(contentsOf: tempArr, at: 0)
            }
            if tempArr.count > 0 {
                
                message = "加载了\(tempArr.count)条数据"
            }
            
            //异步任务完成之后才进行闭包回调
            group.notify(queue: DispatchQueue.main, execute: { 
                //成功回调,加载微博数据
                print("所有单图下载完成")
                callBack(true,message)

            })
            
            
        }
        
    }


}
